package main

/*

请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ，验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。（请参考示例图）
数独部分空格内已填入了数字，空白格用 '.' 表示。
注意：
一个有效的数独（部分已被填充）不一定是可解的。
只需要根据以上规则，验证已经填入的数字是否有效即可。
*/
func main() {
	board := [][]byte{{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
		{'6', '.', '3', '1', '9', '5', '.', '.', '.'},
		{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
		{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
		{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
		{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
		{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
		{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
		{'.', '.', '.', '.', '8', '.', '.', '7', '9'}}

	println(isValidSudoku(board))
}

/**
 *	isValidSudoku
 *	@Description:
 *	@param board [][]byte
 *	@return bool
 */
func isValidSudoku(board [][]byte) bool {
	n := len(board)
	for i := 0; i < n; i++ {
		mR := make(map[byte]int)
		mL := make(map[byte]int)

		for rowP, colP := 0, 0; rowP < n; rowP, colP = rowP+1, colP+1 {
			if board[i][rowP] != '.' {
				mR[board[i][rowP]]++
			}
			if board[colP][i] != '.' {
				mL[board[colP][i]]++
			}
			if mR[board[i][rowP]] == 2 || mL[board[colP][i]] == 2 {
				return false
			}
		}

		row := i / 3
		col := i % 3
		m := make(map[byte]int)
		for j := 0; j < 3; j++ {
			for k := 0; k < 3; k++ {
				if board[j+row*3][k+col*3] != '.' {
					m[board[j+row*3][k+col*3]]++
				}
				if m[board[j+row*3][k+col*3]] == 2 {
					return false
				}
			}
		}
	}
	return true
}
